Day 06
嗨,今天是1/6
又多了一點點的第六天,就來說明requests
吧!
除了前面所介紹的JSON, CSV 資料格式,並不是需要的資料都已經整理成這些格式了,所以才需要透過爬蟲去取得資料,而要得到網頁資料的第一步就是發送請求啦!
Requests allows you to send organic, grass-fed HTTP/1.1 requests, without the need for manual labor. There’s no need to manually add query strings to your URLs, or to form-encode your POST data. Keep-alive and HTTP connection pooling are 100% automatic, thanks to urllib3.
翻譯過來就是說Requests
允許我們發送與接收有機及草飼的 HTTP/1.1 請求 (?) 不需要手動的勞工、將查詢字串添加到Url、對POST數據進行編碼。多虧urllib3 它能夠跟HTTP連接池保持連線且100%自動。
在開始之前要確定環境啦,安裝requests
這個套件:
virtualenv
:source path/to/your/virtualenv/bin/activate
若沒有csv
套件,可用pip
安裝:
pip3
則將pip
改成pip3
pip install requests
完成之後就可以開始使用了:
import requests
現在來get
一個網頁吧,我們以google主頁
為例:
r = requests.get('https://www.google.com')
現在我們得到一個Response
物件叫做r
,可以得到這個物件裡面的資訊像是status_code
, url
, text
(網頁內容)等。
>>> r.status_code
200
>>> r.url
'https://www.google.com'
>>> r.encoding
'utf-8'
search?q=
,而q
後面所代的值就是google搜尋欄位輸入的值。這裡q=python3
,這與直接在url上輸入跟我們在搜尋欄位打入python3是一樣的,以下是搜尋欄位搜尋的畫面:現在我們來驗證它是否正確?我們將text
寫入到一個HTML
檔案吧!
import requests
r = requests.get('https://www.google.com/search?q=python3')
with open('./searchContent.html', 'w+') as f:
f.write(r.text)
print('saved')
執行完確認沒有錯誤之後,我們可以看到當前目錄多了一個searchContent.html
的檔案。
直接打開它會看到:
取得到的內容便是沒有經過js
, css
渲染美化的內容。透過這個方式我們就可以取得它的搜尋結果等需要的內容,之後也會提到該如何去解析它成為拿到我們要的資料。
也能用參數的方式,以dictionary
的格式代入params
參數內:
import requests
payload = {
'q':'python2'
}
r = requests.get('https://www.google.com/search?', params=payload)
with open('./searchContent.html', 'w+') as f:
f.write(r.text)
print('saved')
效果是一樣的!
當然,也有其他HTTP方法可以使用:
>>> r = requests.post('https://httpbin.org/post', data = {'key':'value'})
>>> r = requests.put('https://httpbin.org/put', data = {'key':'value'})
>>> r = requests.delete('https://httpbin.org/delete')
>>> r = requests.head('https://httpbin.org/get')
>>> r = requests.options('https://httpbin.org/get')
有興趣的可以直接到 Quickstart — Requests 2.19.1 documentation
再來說明header
,可以透過headers
這個方法會得到伺服器回傳為一個dictionary的格式:
>>> r.headers
而header
是什麼呢?
是指在HTTP中的請求和回應訊息中的訊息頭,它定義了一個超文字傳輸協定事務中的操作參數。HTTP頭部欄位可以自己根據需要定義,因此可能在Web伺服器和瀏覽器上發現非標準的頭欄位。
請求欄位內容基本上常看到的像是:Accept
: 能夠接受的回應內容類型(Content-Types)Content-Type
: 請求體的多媒體類型(用於POST和PUT請求)Content-Encoding
: 在資料上使用的編碼類型Cache-Control
: 用來指定在這次的請求/回應鏈中的所有快取機制都必須 遵守的指令
既然回傳格式是dic,便可以依照dic的方法取得參數:
r.headers['Content-Type']
# 'application/json'
也可以依照dictionary方式傳遞參數:
headers = {'user-agent': 'my-app/0.0.1'}
r = requests.get(url, headers=headers)
String
, bytestring或unicode。今天說明了Requests
的用法,介紹了如何取得response
不同內容,還有header
,明天會說明HTML標籤的概念,以及如何查看網頁HTML架構,之後也會說明如何解析每一項HTML元素!
參考來源:
http://docs.python-requests.org/en/master/